home *** CD-ROM | disk | FTP | other *** search
/ IRIX 6.3 Development Libraries / SGI IRIX 6.3 Development Libraries.iso / dist6.3 / gl_dev.idb / usr / share / src / OpenGL / toolkits / libaux / teapot.c.z / teapot.c
Encoding:
C/C++ Source or Header  |  1996-12-06  |  3.8 KB  |  126 lines

  1. #include <GL/gl.h>
  2. #include "aux.h"
  3. #include "teapot.h"
  4.  
  5. #if defined(__cplusplus) || defined(c_plusplus)
  6. #define class c_class
  7. #endif
  8.  
  9. long GRD;
  10.  
  11. #define TEAPOTSOLID 0
  12. #define TEAPOTWIRE 1
  13.  
  14. static GLuint teapots[2] = {0, 0};
  15.  
  16. static float tex[2][2][2] = {{{0, 0},{1, 0}},{{0, 1},{1, 1}}};
  17.  
  18. static void solidTeapot(long grid, GLdouble scale)
  19. {
  20.     float p[4][4][3], q[4][4][3], r[4][4][3], s[4][4][3];
  21.     long i, j, k, l;
  22.  
  23.     if (grid < 2) grid = 7;
  24.     GRD = grid;
  25.     teapots[TEAPOTSOLID] = glGenLists (1);
  26.     glNewList(teapots[TEAPOTSOLID], GL_COMPILE);
  27.     glPushMatrix ();
  28.     glRotatef (270.0, 1.0, 0.0, 0.0);
  29.     glScalef (0.5*scale, 0.5*scale, 0.5*scale);
  30.     glTranslatef (0.0, 0.0, -1.5);
  31.     for (i = 0; i < 10; i++) {
  32.     for (j = 0; j < 4; j++)
  33.         for (k = 0; k < 4; k++) 
  34.         for (l = 0; l < 3; l++) {
  35.             p[j][k][l] = cpdata[patchdata[i][j*4+k]][l];
  36.             q[j][k][l] = cpdata[patchdata[i][j*4+(3-k)]][l];
  37.             if (l == 1) q[j][k][l] *= -1.0;
  38.             if (i < 6) {
  39.             r[j][k][l] = cpdata[patchdata[i][j*4+(3-k)]][l];
  40.             if (l == 0) r[j][k][l] *= -1.0;
  41.             s[j][k][l] = cpdata[patchdata[i][j*4+k]][l];
  42.             if (l == 0) s[j][k][l] *= -1.0;
  43.             if (l == 1) s[j][k][l] *= -1.0;
  44.             }
  45.         }
  46.     glMap2f(GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2, &tex[0][0][0]);
  47.     glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &p[0][0][0]);
  48.     glEnable(GL_MAP2_VERTEX_3); glEnable(GL_MAP2_TEXTURE_COORD_2);
  49.     glMapGrid2f(GRD, 0.0, 1.0, GRD, 0.0, 1.0);
  50.     glEvalMesh2(GL_FILL, 0, GRD, 0, GRD);
  51.     glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &q[0][0][0]);
  52.     glEvalMesh2(GL_FILL, 0, GRD, 0, GRD);
  53.     if (i < 6) {
  54.         glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &r[0][0][0]);
  55.         glEvalMesh2(GL_FILL, 0, GRD, 0, GRD);
  56.         glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &s[0][0][0]);
  57.         glEvalMesh2(GL_FILL, 0, GRD, 0, GRD);
  58.     }
  59.     }
  60.     glDisable(GL_MAP2_VERTEX_3); glDisable(GL_MAP2_TEXTURE_COORD_2);
  61.     glPopMatrix ();
  62.     glEndList();
  63. }
  64.  
  65. static void wireTeapot(long grid, GLdouble scale)
  66. {
  67.     float p[4][4][3], q[4][4][3], r[4][4][3], s[4][4][3];
  68.     long i, j, k, l;
  69.     
  70.     if (grid < 2) grid = 7;
  71.     GRD = grid;
  72.     teapots[TEAPOTWIRE] = glGenLists (1);
  73.     glNewList(teapots[TEAPOTWIRE], GL_COMPILE);
  74.     glPushMatrix ();
  75.     glRotatef (270.0, 1.0, 0.0, 0.0);
  76.     glScalef (0.5*scale, 0.5*scale, 0.5*scale);
  77.     glTranslatef (0.0, 0.0, -1.5);
  78.     for (i = 0; i < 10; i++) {
  79.     for (j = 0; j < 4; j++)
  80.         for (k = 0; k < 4; k++) 
  81.         for (l = 0; l < 3; l++) {
  82.             p[j][k][l] = cpdata[patchdata[i][j*4+k]][l];
  83.             q[j][k][l] = cpdata[patchdata[i][j*4+(3-k)]][l];
  84.             if (l == 1) q[j][k][l] *= -1.0;
  85.             if (i < 6) {
  86.             r[j][k][l] = cpdata[patchdata[i][j*4+(3-k)]][l];
  87.             if (l == 0) r[j][k][l] *= -1.0;
  88.             s[j][k][l] = cpdata[patchdata[i][j*4+k]][l];
  89.             if (l == 0) s[j][k][l] *= -1.0;
  90.             if (l == 1) s[j][k][l] *= -1.0;
  91.             }
  92.         }
  93.     glMap2f(GL_MAP2_TEXTURE_COORD_2, 0, 1, 2, 2, 0, 1, 4, 2, &tex[0][0][0]);
  94.     glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &p[0][0][0]);
  95.     glEnable(GL_MAP2_VERTEX_3); glEnable(GL_MAP2_TEXTURE_COORD_2);
  96.     glMapGrid2f(GRD, 0.0, 1.0, GRD, 0.0, 1.0);
  97.     glEvalMesh2(GL_LINE, 0, GRD, 0, GRD);
  98.     glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &q[0][0][0]);
  99.     glEvalMesh2(GL_LINE, 0, GRD, 0, GRD);
  100.     if (i < 6) {
  101.         glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &r[0][0][0]);
  102.         glEvalMesh2(GL_LINE, 0, GRD, 0, GRD);
  103.         glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &s[0][0][0]);
  104.         glEvalMesh2(GL_LINE, 0, GRD, 0, GRD);
  105.     }
  106.     }
  107.     glDisable(GL_MAP2_VERTEX_3); glDisable(GL_MAP2_TEXTURE_COORD_2);
  108.     glPopMatrix ();
  109.     glEndList();
  110. }
  111.  
  112. void auxSolidTeapot(GLdouble scale)
  113. {
  114.     if (glIsList(teapots[TEAPOTSOLID]) == 0)
  115.     solidTeapot (14, scale);
  116.     glCallList(teapots[TEAPOTSOLID]);
  117. }
  118.  
  119. void auxWireTeapot(GLdouble scale)
  120. {
  121.     if (glIsList(teapots[TEAPOTWIRE]) == 0)
  122.     wireTeapot (10, scale);
  123.     glCallList(teapots[TEAPOTWIRE]);
  124. }
  125.  
  126.